From: Boris Ostrovsky Date: Fri, 23 Jan 2015 16:51:43 +0000 (+0100) Subject: x86/VPMU: make vpmu macros a bit more efficient X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~3864 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=c71b23096966fd60726ed4f4e7ae1469f10bbe64;p=xen.git x86/VPMU: make vpmu macros a bit more efficient Introduce vpmu_are_all_set that allows testing multiple bits at once. Convert macros into inlines for better compiler checking. Signed-off-by: Boris Ostrovsky Acked-by: Kevin Tian Reviewed-by: Konrad Rzeszutek Wilk Reviewed-by: Dietmar Hahn Tested-by: Dietmar Hahn --- diff --git a/xen/arch/x86/hvm/vmx/vpmu_core2.c b/xen/arch/x86/hvm/vmx/vpmu_core2.c index c9fb2023f2..951aecebb4 100644 --- a/xen/arch/x86/hvm/vmx/vpmu_core2.c +++ b/xen/arch/x86/hvm/vmx/vpmu_core2.c @@ -326,10 +326,7 @@ static int core2_vpmu_save(struct vcpu *v) { struct vpmu_struct *vpmu = vcpu_vpmu(v); - if ( !vpmu_is_set(vpmu, VPMU_CONTEXT_SAVE) ) - return 0; - - if ( !vpmu_is_set(vpmu, VPMU_CONTEXT_LOADED) ) + if ( !vpmu_are_all_set(vpmu, VPMU_CONTEXT_SAVE | VPMU_CONTEXT_LOADED) ) return 0; __core2_vpmu_save(v); diff --git a/xen/arch/x86/hvm/vpmu.c b/xen/arch/x86/hvm/vpmu.c index e17e19459c..63b2158377 100644 --- a/xen/arch/x86/hvm/vpmu.c +++ b/xen/arch/x86/hvm/vpmu.c @@ -143,8 +143,7 @@ void vpmu_save(struct vcpu *v) struct vpmu_struct *vpmu = vcpu_vpmu(v); int pcpu = smp_processor_id(); - if ( !(vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) && - vpmu_is_set(vpmu, VPMU_CONTEXT_LOADED)) ) + if ( !vpmu_are_all_set(vpmu, VPMU_CONTEXT_ALLOCATED | VPMU_CONTEXT_LOADED) ) return; vpmu->last_pcpu = pcpu; diff --git a/xen/include/asm-x86/hvm/vpmu.h b/xen/include/asm-x86/hvm/vpmu.h index 1f28bd85e1..ddc2748498 100644 --- a/xen/include/asm-x86/hvm/vpmu.h +++ b/xen/include/asm-x86/hvm/vpmu.h @@ -82,10 +82,27 @@ struct vpmu_struct { #define VPMU_CPU_HAS_BTS 0x200 /* Has Branch Trace Store */ -#define vpmu_set(_vpmu, _x) ((_vpmu)->flags |= (_x)) -#define vpmu_reset(_vpmu, _x) ((_vpmu)->flags &= ~(_x)) -#define vpmu_is_set(_vpmu, _x) ((_vpmu)->flags & (_x)) -#define vpmu_clear(_vpmu) ((_vpmu)->flags = 0) +static inline void vpmu_set(struct vpmu_struct *vpmu, const u32 mask) +{ + vpmu->flags |= mask; +} +static inline void vpmu_reset(struct vpmu_struct *vpmu, const u32 mask) +{ + vpmu->flags &= ~mask; +} +static inline void vpmu_clear(struct vpmu_struct *vpmu) +{ + vpmu->flags = 0; +} +static inline bool_t vpmu_is_set(const struct vpmu_struct *vpmu, const u32 mask) +{ + return !!(vpmu->flags & mask); +} +static inline bool_t vpmu_are_all_set(const struct vpmu_struct *vpmu, + const u32 mask) +{ + return !!((vpmu->flags & mask) == mask); +} int vpmu_do_wrmsr(unsigned int msr, uint64_t msr_content, uint64_t supported); int vpmu_do_rdmsr(unsigned int msr, uint64_t *msr_content);